package com.woniuxy.lab.woniu_lab_boss.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.Collections;

// Swagger文档配置
@Configuration
//@EnableSwagger2// 启用swagger
public class SwaggerConfig {

    private static final String TITLE = "蜗牛安全实验室接口文档（后台）";// 文档标题
    private static final String DESCRIPTION = "本项目分为前台和后台：前台给用户使用（8080端口）；后台给讲师和管理员使用（8090端口）。";// 文档描述
    private static final String VERSION = "v3.0";// 文档版本
    private static final String AUTHOR = "Silas";// 作者
    private static final String WEB = "https://blog.csdn.net/xuzhongyi103";// 作者网站
    private static final String EMAIL = "xuxilin1997@qq.com";// 作者邮箱
    private static final String CONTROLLER = "com.woniuxy.lab.woniu_lab_boss.controller";// controller所在包

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)
                .enable(true)// 开发环境开启swagger文档
                .securitySchemes(Collections.singletonList(this.tokenScheme()))
                .securityContexts(Collections.singletonList(this.tokenContext()))
                .apiInfo(this.apiInfo())
                .select()// 使用过滤
                .apis(RequestHandlerSelectors.basePackage(CONTROLLER))
                .paths(PathSelectors.any())
                .build();
    }

    // 返回docket所需的apiInfo（swagger文档基础信息）
    private ApiInfo apiInfo(){
        Contact contact = new Contact(AUTHOR, WEB, EMAIL);// 作者信息
        ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
        return apiInfoBuilder.title(TITLE).description(DESCRIPTION).version(VERSION).contact(contact).build();
    }

    private HttpAuthenticationScheme tokenScheme() {
        return HttpAuthenticationScheme.JWT_BEARER_BUILDER.name("lap-boss-token").build();
    }

    private SecurityContext tokenContext() {
        SecurityReference authorization = SecurityReference.builder().scopes(new AuthorizationScope[0]).reference("lap-boss-token").build();
        return SecurityContext.builder()
                .securityReferences(Collections.singletonList(authorization))
                .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                .build();
    }

//    @Bean
//    public Docket createDocket() {
//
//        // 1.配置文档参数
//        ParameterBuilder paramBuilder = new ParameterBuilder()
//                .name("lap.user.token")
//                .description("token令牌")
//                .modelRef(new ModelRef("string"))
//                .parameterType("header")
//                .required(false); // false表示header中的token参数可以为空
//        List<Parameter> params = new ArrayList<>();// 创建参数集合
//        params.add(paramBuilder.build());
//
//        // 2.生成文档对象 选择文档类型 设置全局参数
//        Docket docket = new Docket(DocumentationType.SWAGGER_2).globalOperationParameters(params);
//
//        // 3.准备文档基本信息
//        ApiInfo apiInfo = new ApiInfoBuilder()
//                .title("蜗牛实验室api文档")
//                .contact(new Contact("Silas", "https://blog.csdn.net/xuzhongyi103", "xuxilin1997@qq.com"))
//                .description("蜗牛书城接口api文档")
//                .build();
//
//        // 4.将文档基本信息加入到文档对象 设置对生成文档的接口路径扫描 扫描controller包
//        docket.apiInfo(apiInfo)
//                .select()
//                .apis(RequestHandlerSelectors.basePackage("com.woniuxy.lab.woniu_lab.controller"))
//                .paths(PathSelectors.any())
//                .build();
//
//        return docket;
//    }

}
